package com.wootion.cims.general.utils;

import com.alibaba.fastjson.JSONObject;
import org.apache.commons.lang3.StringUtils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class PasswprdUtil {
    /**
     *
     * @param sourceStr 源字符串
     * @param sourceStart 源字符串起始位置
     * @param targetStr 目标字符串
     * @param targetStart 目标字符串起始位置
     * @return true/false
     */
    public static boolean contains(String sourceStr,int sourceStart,String targetStr,int targetStart){
        if(StringUtils.isBlank(sourceStr) || StringUtils.isBlank(targetStr)){
            return false;
        }

        char[] source = sourceStr.toCharArray();
        char[] target = targetStr.toCharArray();

        int max =source.length-target.length+targetStart;
        for(;sourceStart<=max;sourceStart++){
            int i=sourceStart;
            //找到第一个相等的字符索引
            while(i<=max && source[i]!=target[targetStart]){
                i++;
            }
            if (i==source.length){
                i--;
            }
            //如果上面循环结束后，索引位置对应值相等的话，继续比较后面几位，否则证明第一个字符都没有相等的
            if(source[i]==target[targetStart]){

                //索引循环区间 [本次相等索引，相等索引+目标lenth)
                int end = i+target.length-targetStart;
                int j=targetStart;
                //只要值相等，就向下比较
                //(i<end必须放在前面，因为最后一位相等时，j已经加上去了，先判断后面的会数组越界)
                while(i<end && source[i]==target[j]){
                    i++;
                    j++;
                }
                if(i==end){
                    return true;
                }
            }
        }
        return false;
    }

    public static JSONObject accel(String password){
        int length = 8;//规定长度
        boolean isHaveUpper = false;
        boolean isHaveLowwer = false;
        boolean isHavespecile = false;
        boolean isHaveNuber = false;
        int haveNumber = 0;//包含几种
        int shouldNuber = 3;//应该包含几种

        JSONObject jsonObject = new JSONObject();

//        1.验证长度是否符合
        if (password.length() < length){
            jsonObject.put("status",false);
            jsonObject.put("messages","密码长度不符合要求");
            return jsonObject;
        }

//        2.密码大小写以及特殊字符验证
        String regEx = "[ _`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~！@#￥%……&*（）——+|{}【】‘；：”“’。，、？]|\n|\r|\t";
        Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(password);
        boolean b = m.find();
        if (b){
            isHavespecile = true;
        }

        boolean matches = password.matches("[0-9]{1,}");
        if (matches){
            isHaveNuber = true;
        }

        for (int i = 0; i < password.length(); i++) {
            char c = password.charAt(i);
            if (Character.isUpperCase(c)){
                isHaveUpper = true;
            }else if (Character.isLowerCase(c)){
                isHaveLowwer = true;
            }
        }

        if (isHaveLowwer){
            haveNumber++;
        }
        if (isHaveUpper){
            haveNumber++;
        }
        if (isHavespecile){
            haveNumber++;
        }
        if (isHaveNuber){
            haveNumber++;
        }
        if (haveNumber<shouldNuber){
            jsonObject.put("status",false);
            jsonObject.put("messages","密码复杂度不符合要求");
            return jsonObject;
        }

        jsonObject.put("status",true);
        return jsonObject;

    }
}
